﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace Sakura.Media.AviSynth.Native
{
	/// <summary>
	/// 表示一个 AVS 值。
	/// </summary>
	[StructLayout(LayoutKind.Sequential)]
	internal struct AvsValue
	{
		/// <summary>
		/// 表示值的类型。
		/// </summary>
		public AvsValueType Type;
		/// <summary>
		/// 如果值是一个数组，则表示数组的长度。
		/// </summary>
		public short ArraySize;
		/// <summary>
		/// 表示值的值。
		/// </summary>
		public AvsValueUnion Value;
	}

	/// <summary>
	/// 封装值的域定义类型。
	/// </summary>
	internal enum AvsValueType : short
	{
		/// <summary>
		/// 空值，没有任何类型。
		/// </summary>
		Void = (short)'v',
		/// <summary>
		/// 一段数据流。
		/// </summary>
		Clip = (short)'c',
		/// <summary>
		/// 布尔类型。
		/// </summary>
		Boolean = (short)'b',
		/// <summary>
		/// 整数类型。
		/// </summary>
		Integer = (short)'i',
		/// <summary>
		/// 浮点类型。
		/// </summary>
		Float = (short)'f',
		/// <summary>
		/// 字符串类型。
		/// </summary>
		String = (short)'s',
		/// <summary>
		/// 数组类型。
		/// </summary>
		Array = (short)'a',
		/// <summary>
		/// 错误类型。
		/// </summary>
		Error = (short)'e',
	}

	/// <summary>
	/// 用于定义 AVS 值的联合。
	/// </summary>
	[StructLayout(LayoutKind.Explicit)]
	internal struct AvsValueUnion
	{
		[FieldOffset(0)]
		public IntPtr Clip;

		[FieldOffset(0)]
		public byte Boolean;

		[FieldOffset(0)]
		public int Integer;

		[FieldOffset(0)]
		public float FloatPtr;

		[FieldOffset(0)]
		[MarshalAs(UnmanagedType.LPStr)]
		public string String;

		[FieldOffset(0)]
		public IntPtr Array;
	}
}
